home *** CD-ROM | disk | FTP | other *** search
- #include <SWIncludes.h>
- #include "Shark Attack.h"
- #include "NewSprite.h"
- #include "SpriteMoveProcs.h"
- #include "GlobalVariables.h"
- #include "SWSounds.h"
-
-
- //--------------------------------------------------------------------------------
- // SubSpriteMoveProc
- //--------------------------------------------------------------------------------
-
- SW_FUNC void SubSpriteMoveProc(SpritePtr subSpriteP)
- {
- double horizDelta, vertDelta;
- short bulletSpeed;
- SpritePtr newBulletSpriteP;
- SubStructPtr subStructP = (SubStructPtr)subSpriteP;
-
- horizDelta = subStructP->horizDelta;
- vertDelta = subStructP->vertDelta;
-
- if (gKeys.left) // Increase speed if keys are down
- {
- if (subStructP->curDirection != kLeftDirection)
- {
- subStructP->curDirection = kLeftDirection;
- SWSetCurrentFrameIndex(subSpriteP, kSubLeftFrameIndex);
- }
-
- horizDelta -= kSubAcceleration;
- if (horizDelta < -kSubMaxSpeed)
- horizDelta = -kSubMaxSpeed;
- }
- else if (gKeys.right)
- {
- if (subStructP->curDirection != kRightDirection)
- {
- subStructP->curDirection = kRightDirection;
- SWSetCurrentFrameIndex(subSpriteP, kSubRightFrameIndex);
- }
-
- horizDelta += kSubAcceleration;
- if (horizDelta > kSubMaxSpeed)
- horizDelta = kSubMaxSpeed;
- }
- else // Decrease speed if no key is held
- {
- if (horizDelta > 0)
- {
- horizDelta -= kSubDeacceleration;
- if (horizDelta < 0)
- horizDelta = 0;
- }
- else if (horizDelta < 0)
- {
- horizDelta += kSubDeacceleration;
- if (horizDelta > 0)
- horizDelta = 0;
- }
- }
-
-
- if (gKeys.up) // Increase speed if keys are down
- {
- vertDelta -= kSubAcceleration;
- if (vertDelta < -kSubMaxSpeed)
- vertDelta = -kSubMaxSpeed;
- }
- else if (gKeys.down)
- {
- vertDelta += kSubAcceleration;
- if (vertDelta > kSubMaxSpeed)
- vertDelta = kSubMaxSpeed;
- }
- else // Decrease speed if no key is held
- {
- if (vertDelta > 0)
- {
- vertDelta -= kSubDeacceleration;
- if (vertDelta < 0)
- vertDelta = 0;
- }
- else if (vertDelta < 0)
- {
- vertDelta += kSubDeacceleration;
- if (vertDelta > 0)
- vertDelta = 0;
- }
- }
-
-
- subStructP->horizDelta = horizDelta;
- subStructP->vertDelta = vertDelta;
-
- subStructP->horizPos += subStructP->horizDelta;
- subStructP->vertPos += subStructP->vertDelta;
-
-
- // Keep within moveBounds
- if (subStructP->vertPos < subSpriteP->moveBoundsRect.top)
- {
- subStructP->vertDelta = 0;
- subStructP->vertPos = subSpriteP->moveBoundsRect.top;
- }
- else if (subStructP->vertPos + kSubHeight > subSpriteP->moveBoundsRect.bottom)
- {
- subStructP->vertDelta = 0;
- subStructP->vertPos = subSpriteP->moveBoundsRect.bottom - kSubHeight;
- }
-
- if (subStructP->horizPos < subSpriteP->moveBoundsRect.left)
- {
- subStructP->horizDelta = 0;
- subStructP->horizPos = subSpriteP->moveBoundsRect.left;
- }
- else if (subStructP->horizPos + kSubWidth > subSpriteP->moveBoundsRect.right)
- {
- subStructP->horizDelta = 0;
- subStructP->horizPos = subSpriteP->moveBoundsRect.right - kSubWidth;
- }
-
- SWMoveSprite(subSpriteP, subStructP->horizPos, subStructP->vertPos);
-
-
- if (gKeys.shoot || gKeys.shift)
- {
- if (subStructP->canShoot)
- {
- subStructP->canShoot = false;
-
- if ( (subStructP->numBulletsOnScreen < kMaxNumBullets) || kMachineGun)
- {
- short stereoPos;
-
- stereoPos = GetStereoPositionOfSprite(subSpriteP, &gSpriteWorldP->backRect);
- PlaySound2(kShootBulletSnd, 3, kReplaceSameSound, 256, stereoPos, k22khz, false);
-
- newBulletSpriteP = NewBulletSprite();
- ((BulletStructPtr)newBulletSpriteP)->parentStructP = subStructP;
- subStructP->numBulletsOnScreen++;
- gLastBulletP = newBulletSpriteP;
-
- if (kMachineGun)
- bulletSpeed = kMachineGunSpeed;
- else
- bulletSpeed = kNormalBulletSpeed;
-
- if (subStructP->curDirection == kLeftDirection)
- {
- newBulletSpriteP->horizMoveDelta = -bulletSpeed;
- newBulletSpriteP->horizMoveDelta += subStructP->horizDelta;
- SWSetSpriteLocation(newBulletSpriteP,
- subSpriteP->destFrameRect.left - kBulletWidth,
- subSpriteP->destFrameRect.top + 8);
- }
- else
- {
- newBulletSpriteP->horizMoveDelta = bulletSpeed;
- newBulletSpriteP->horizMoveDelta += subStructP->horizDelta;
- SWSetSpriteLocation(newBulletSpriteP,
- subSpriteP->destFrameRect.right,
- subSpriteP->destFrameRect.top + 8);
- }
- }
- }
- else if (kMachineGun)
- {
- subStructP->nextShotDelay++;
- if (subStructP->nextShotDelay >= kNextShotDelay)
- {
- subStructP->nextShotDelay = 0;
- subStructP->canShoot = true;
- }
- }
- }
- else if (kMachineGun && subStructP->canShoot == false)
- {
- subStructP->nextShotDelay++;
- if (subStructP->nextShotDelay >= kNextShotDelay)
- {
- subStructP->nextShotDelay = 0;
- subStructP->canShoot = true;
- }
- }
- else
- {
- subStructP->canShoot = true;
- }
- }
-
-
- //--------------------------------------------------------------------------------
- // LevelDoneSubMoveProc - installed when the level is done - slows sub to a stop
- //--------------------------------------------------------------------------------
-
- SW_FUNC void LevelDoneSubMoveProc(SpritePtr subSpriteP)
- {
- double horizDelta, vertDelta;
- SubStructPtr subStructP = (SubStructPtr)subSpriteP;
-
- horizDelta = subStructP->horizDelta;
- vertDelta = subStructP->vertDelta;
-
- // Slow the sub down if it's moving
- if (horizDelta > 0)
- {
- horizDelta -= kSubDeacceleration;
- if (horizDelta < 0)
- horizDelta = 0;
- }
- else if (horizDelta < 0)
- {
- horizDelta += kSubDeacceleration;
- if (horizDelta > 0)
- horizDelta = 0;
- }
-
- if (vertDelta > 0)
- {
- vertDelta -= kSubDeacceleration;
- if (vertDelta < 0)
- vertDelta = 0;
- }
- else if (vertDelta < 0)
- {
- vertDelta += kSubDeacceleration;
- if (vertDelta > 0)
- vertDelta = 0;
- }
-
-
- subStructP->horizDelta = horizDelta;
- subStructP->vertDelta = vertDelta;
-
- subStructP->horizPos += subStructP->horizDelta;
- subStructP->vertPos += subStructP->vertDelta;
-
-
- // Keep within moveBounds
- if (subStructP->vertPos < subSpriteP->moveBoundsRect.top)
- {
- subStructP->vertDelta = 0;
- subStructP->vertPos = subSpriteP->moveBoundsRect.top;
- }
- else if (subStructP->vertPos + kSubHeight > subSpriteP->moveBoundsRect.bottom)
- {
- subStructP->vertDelta = 0;
- subStructP->vertPos = subSpriteP->moveBoundsRect.bottom - kSubHeight;
- }
-
- if (subStructP->horizPos < subSpriteP->moveBoundsRect.left)
- {
- subStructP->horizDelta = 0;
- subStructP->horizPos = subSpriteP->moveBoundsRect.left;
- }
- else if (subStructP->horizPos + kSubWidth > subSpriteP->moveBoundsRect.right)
- {
- subStructP->horizDelta = 0;
- subStructP->horizPos = subSpriteP->moveBoundsRect.right - kSubWidth;
- }
-
- SWMoveSprite(subSpriteP, subStructP->horizPos, subStructP->vertPos);
- }
-
-
- //--------------------------------------------------------------------------------
- // DeadSubSpriteMoveProc - installed as the sub's moveProc when the sub gets hit
- //--------------------------------------------------------------------------------
-
- SW_FUNC void DeadSubSpriteMoveProc(SpritePtr subSpriteP)
- {
- SubStructPtr subStructP = (SubStructPtr)subSpriteP;
-
- if (subSpriteP->oldFrameRect.top >= subSpriteP->moveBoundsRect.bottom)
- {
- gSubIsStillOnScreen = false;
- }
- else
- {
- subStructP->vertDelta += .05;
- if (subStructP->vertDelta > 5)
- subStructP->vertDelta = 5;
-
- subStructP->vertPos += subStructP->vertDelta;
-
- SWMoveSprite(subSpriteP, subStructP->horizPos, subStructP->vertPos);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BulletSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BulletSpriteMoveProc(SpritePtr srcSpriteP)
- {
- // Don't move the sprite if it was just now created
- // and hasn't even been drawn yet.
- if (srcSpriteP->needsToBeDrawn)
- return;
-
- SWOffsetSprite(srcSpriteP, srcSpriteP->horizMoveDelta, 0);
-
- if (srcSpriteP->oldFrameRect.right < srcSpriteP->moveBoundsRect.left ||
- srcSpriteP->oldFrameRect.left > srcSpriteP->moveBoundsRect.right)
- {
- ((BulletStructPtr)srcSpriteP)->parentStructP->numBulletsOnScreen--;
- SWRemoveSpriteFromAnimation(gSpriteWorldP, srcSpriteP, true);
- if (srcSpriteP == gLastBulletP)
- gLastBulletP = NULL;
- }
-
- // Update the stereo position of the bullet sound based on the position
- // of the bullet that was shot most recently.
- if (srcSpriteP == gLastBulletP)
- {
- short stereoPos, channelNum;
-
- channelNum = FindSound(kShootBulletSnd);
- stereoPos = GetStereoPositionOfSprite(srcSpriteP, &gSpriteWorldP->backRect);
- SetStereoPosition(channelNum, stereoPos);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // FishSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void FishSpriteMoveProc(SpritePtr fishSpriteP)
- {
- FishStructPtr fishStructP = (FishStructPtr)fishSpriteP;
-
- // If the fish was just hit and flashed white, change back to normal drawProc
- if (fishStructP->hitCounter > 0)
- {
- if (--fishStructP->hitCounter == 0)
- {
- fishSpriteP->needsToBeDrawn = true;
- SWSetSpriteDrawProc(fishSpriteP, gSpriteMaskDrawProc);
- }
- }
-
- // Don't move the fish if it was hit recently
- if (fishStructP->moveDelay > 0)
- {
- fishStructP->moveDelay--;
- return;
- }
-
- SWOffsetSprite(fishSpriteP, fishSpriteP->horizMoveDelta, 0);
-
- if ( (fishSpriteP->oldFrameRect.right < fishSpriteP->moveBoundsRect.left &&
- fishSpriteP->horizMoveDelta < 0) ||
- (fishSpriteP->oldFrameRect.left > fishSpriteP->moveBoundsRect.right &&
- fishSpriteP->horizMoveDelta > 0) )
- {
- gNumFishOnScreen--;
- SWRemoveSpriteFromAnimation(gSpriteWorldP, fishSpriteP, true);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SharkSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void SharkSpriteMoveProc(SpritePtr sharkSpriteP)
- {
- SharkStructPtr sharkStructP = (SharkStructPtr)sharkSpriteP;
- SubStructPtr subStructP = (SubStructPtr)gSubCloneP;
- short sharkMid = sharkSpriteP->oldFrameRect.top + kSharkHeight/2;
- short subMid = gSubCloneP->oldFrameRect.top + kSubHeight/2;
-
-
- // If the fish was just hit and flashed white, change back to normal drawProc
- if (sharkStructP->hitCounter > 0)
- {
- if (--sharkStructP->hitCounter == 0)
- {
- sharkSpriteP->needsToBeDrawn = true;
- SWSetSpriteDrawProc(sharkSpriteP, gSpriteMaskDrawProc);
- }
- }
-
- // Make the shark follow the submarine
- if (sharkMid > subMid)
- {
- sharkStructP->vertDelta -= kSharkAcceleration;
- if (sharkStructP->vertDelta < -kSharkMaxSpeed)
- sharkStructP->vertDelta = -kSharkMaxSpeed;
-
- // Make sure the shark didn't move past the sub
- if (sharkMid + sharkStructP->vertDelta < subMid)
- {
- sharkStructP->vertDelta = subMid - sharkMid;
- }
- }
- else if (sharkMid < subMid)
- {
- sharkStructP->vertDelta += kSharkAcceleration;
- if (sharkStructP->vertDelta > kSharkMaxSpeed)
- sharkStructP->vertDelta = kSharkMaxSpeed;
-
- // Make sure the shark didn't move past the sub
- if (sharkMid + sharkStructP->vertDelta > subMid)
- {
- sharkStructP->vertDelta = subMid - sharkMid;
- }
- }
- else if (subStructP->vertDelta == 0)
- {
- sharkStructP->vertDelta = 0;
- }
-
- // Move the shark slower than normal if it was hit recently
- if (sharkStructP->moveDelay > 0)
- {
- sharkStructP->moveDelay--;
- sharkStructP->horizPos += sharkStructP->horizDelta/2;
- sharkStructP->vertPos += sharkStructP->vertDelta/2;
- }
- else
- {
- sharkStructP->horizPos += sharkStructP->horizDelta;
- sharkStructP->vertPos += sharkStructP->vertDelta;
- }
-
-
- SWMoveSprite(sharkSpriteP, sharkStructP->horizPos, sharkStructP->vertPos);
-
- // Turn the shark around if it went past the edge of the screen
- if ( (sharkSpriteP->oldFrameRect.right < sharkSpriteP->moveBoundsRect.left-40 &&
- sharkStructP->horizDelta < 0) ||
- (sharkSpriteP->oldFrameRect.left > sharkSpriteP->moveBoundsRect.right+40 &&
- sharkStructP->horizDelta > 0) )
- {
- sharkStructP->horizDelta = -sharkStructP->horizDelta;
-
- // Change set of frames used to animate the shark
- if (sharkStructP->horizDelta > 0)
- {
- SWSetSpriteFrameRange(sharkSpriteP, 0, 2);
- SWSetCurrentFrameIndex(sharkSpriteP, 0);
- }
- else
- {
- SWSetSpriteFrameRange(sharkSpriteP, 3, 5);
- SWSetCurrentFrameIndex(sharkSpriteP, 3);
- }
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // FishHitDrawProc - Note: this DrawProc requires the sprite to have a maskRgn. If you
- // look at NewSprite(), you'll see that the fish and shark sprites were both loaded
- // with kFatMask, instead of kPixelMask, so this drawProc could be used for them.
- //
- // Note also that since PaintRgn gives us no option to clip our drawing to the dstRect,
- // we turn the dstRect into a region and "clip" the frame's region to the dstRect
- // region with SectRgn. An alternative would be to call ClipRect to set the current
- // clipping region to dstRect before making the call to PaintRgn. (Remembering to
- // restore the old clipping region when done). This clipping must be done because
- // sometimes (especially in scrolling games) only part of a sprite will be drawn.
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void FishHitDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- #pragma unused(dstFrameP) // Tell CodeWarrior this variable is unused
-
- if (srcFrameP->maskRgn != NULL)
- {
- Rect rgnRect = (**srcFrameP->maskRgn).rgnBBox;
-
- // move the mask region to the sprite location
- OffsetRgn(srcFrameP->maskRgn,
- (dstRect->left - (srcRect->left - srcFrameP->frameRect.left) - rgnRect.left)
- + srcFrameP->offsetPoint.h,
- (dstRect->top - (srcRect->top - srcFrameP->frameRect.top) - rgnRect.top)
- + srcFrameP->offsetPoint.v);
-
- // Here we "clip" the srcFrameP->maskRgn with the dstRect.
- RectRgn(gTempRgn, dstRect);
- SectRgn(gTempRgn, srcFrameP->maskRgn, gTempRgn);
-
- ForeColor(whiteColor);
- PaintRgn(gTempRgn);
- ForeColor(blackColor);
- }
- }
-
-